--[[
	service，跑马灯, 暂时放到gate上，以后要么加入reload，要么放到hall节点去
	循环跑马灯设计： 
	1，两种
	一种是启动就下载固定配置的，客户端没有跑马灯播放时，就循环从这里顺序播放，这个类似公告
	二种就是随着心跳下发的。带优先级的，客户端先全部压入自己的队列，然后从优先级顺序播放。
]]
local filename = "horseracelamp.lua"
local skynet = require "skynet"
require "skynet.manager"
local string = string

local filelog = require "filelog"
local timetool = require "timetool"

local routerbase = require "routerbase"

local Horseracelamp = routerbase:new()

local configmsg = {
    "{\"cmd\":1,\"TX_Alipy\":1}",
}

--[[
  动态跑马灯的算法， 消息队列只保持一定数量的，比如10条的。先进先出
  每次服务器启动，hrlsize 为1，每加一条，hrlsize+1
  每个agent，有个 hrlindex ，初始值为0，每次触发要dynamicmsg时，
  把 [hrlindex, hrlsize] 之间的消息发给客户端，然后hrlindex=hrlsize
]]

local hrlsize = 0 -- 每加一条 hrlsize+1
local hrllen = 5 -- 固定暂存10条
local hrlmsg = {} -- 动态跑马灯消息数组 hrlsize-hrllen+1, hrlsize-hrllen+2 ...... hrlsize 做主键的

-- 每个agent登录，获取配置好的固定的跑马灯配置， 当没有其他消息的时候，客户端循环播放，类似公告
-- 暂时就固定在本文件内部，以后可以考虑从redis中获取
function Horseracelamp.CMD.gethrlconfigmsg()
	return {configmsg = configmsg}
end

--设置跑马灯
function Horseracelamp.CMD.sethrlconfigmsg(new_configmsg)
    if type(new_configmsg) == "table" then
	    configmsg = new_configmsg
    end
end

-- 加入动态跑马灯消息，主要是一个table {level, repeatnum, content}
function Horseracelamp.CMD.addhrlmsg(msg)
	if not msg.content then return false end
	local level = tonumber(msg.level or 2)
	local repeatnum = tonumber(msg.repeatnum or 1)
	hrlsize = hrlsize + 1
	hrlmsg[hrlsize] = {level=level, repeatnum=repeatnum, content=msg.content}
	-- 删掉老的跑马灯消息， 消息数组就是从 hrlsize-hrllen+1 开始 到 hrlsize
	if hrlsize - hrllen > 0 then
		hrlmsg[hrlsize-hrllen] = nil
	end
	return true
end

-- 获得当前所有跑马灯
function Horseracelamp.CMD.getallhrlmsg()
    return {staticmsg = configmsg, dynamicmsg = hrlmsg}
end

-- 删除某条跑马灯
-- index 跑马灯在数组中索引
-- hrltype 跑马灯类型 1动态（默认删除动态) 2静态
function Horseracelamp.CMD.delhrlmsg(index, hrltype)
    if not index or index < 1 then
        return
    end

    if hrltype == 2 then
        local new_configmsg = { }
        for i,v in ipairs(configmsg) do
            if i ~= index then
                table.insert(new_configmsg,v)
            end
        end
        configmsg = new_configmsg
    else
        hrlsize = 0
        local new_hrlmsg = { }
        for k,v in pairs(hrlmsg) do
            if k ~= index then
                hrlsize = hrlsize + 1
                new_hrlmsg[hrlsize] = v
            end
        end
        hrlmsg = new_hrlmsg
    end
end

-- 这个接口在每次心跳的时候调用
-- hrlindex 是保存在agent上的, 从0 开始
-- 暂时没有去判断时间
function Horseracelamp.CMD.gethrldynamicmsg( hrlindex )
	if hrlindex >= hrlsize then 
		return {hrlsize = hrlsize}
	end
	local tmpmsg = {}
	for i,v in pairs(hrlmsg) do
		filelog.print(i, v)
		if i > hrlindex then
			table.insert(tmpmsg, v)
		end
	end
	return {hrlsize = hrlsize, hrlmsg = tmpmsg}
end

skynet.start(function ()
	Horseracelamp:start()
	math.randomseed(os.time())
end)
